package actions.register;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;

import utils.Profiles;

import domain.Municipio;
import domain.Perfil;
import domain.Provincia;
import domain.Usuario;

@Name("registerUser")
@Scope(ScopeType.SESSION)
public class RegisterUserAction implements Serializable {

	private static final long serialVersionUID = 5232141401703439353L;

	@In
	EntityManager em;

	@In
	FacesMessages facesMessages;

	// Datos de registro

	@In(required = false)
	private Usuario user = new Usuario();

	private Provincia provinciaUsuario;
	private Municipio municipioUsuario;

	/***************************************************************************
	 * Indica si la provincia seleccionada cambia para reducir el acceso a la
	 * tabla municipios
	 **************************************************************************/

	Provincia ultimaProvinciaSeleccionada = new Provincia();

	// Lista de Municipios para Mostrar al Usuario
	List<Municipio> municipios;

	// Perfil que se le va a asignar al nuevo usuario
	Perfil perfil;

	@Begin
	public String initRegister() {
		perfil = (Perfil) em.createQuery(
				"SELECT p FROM Perfil p where p.nombre =:prf").setParameter(
				"prf", Profiles.PROFILE_CLIENTE).getSingleResult();
		return "registerUser";
	}

	@Begin
	public String initRegisterOwner() {
		perfil = (Perfil) em.createQuery(
				"SELECT p FROM Perfil p where p.nombre =:prf").setParameter(
				"prf", Profiles.PROFILE_OWNER).getSingleResult();
		return "registerUser";
	}

	public String register() {

		if (validateData()) {

			if (userExist(user.getUsuario())) {
				facesMessages.addFromResourceBundle("userExist");
				return null;
			}

			user.setMunicipio(this.getMunicipioUsuario());
			user.setPerfil(perfil);
			em.persist(user);

			return "userRegistered";

		}
		return null;

	}

	private boolean userExist(String usuario) {
		return !em.createQuery("From Usuario WHERE usuario=?").setParameter(1,
				usuario).getResultList().isEmpty();
	}

	@End
	public String confirm() {
		return "login";
	}

	@End
	public String cancel() {
		return "login";
	}

	@SuppressWarnings("unchecked")
	public List<Municipio> findMunicipios() {

		if (provinciaUsuario != null) {
			if (ultimaProvinciaSeleccionada.getProvincia() != provinciaUsuario
					.getProvincia()) { // Si el usuario selecciona otra
				// provincia
				municipios = (List<Municipio>) em.createQuery(
						"FROM Municipio m WHERE m.provincia.provincia = "
								+ provinciaUsuario.getProvincia())
						.getResultList();
				ultimaProvinciaSeleccionada.setProvincia(provinciaUsuario
						.getProvincia());
			}
		} else
			// Si no hay provincia seleccionada
			municipios = new ArrayList<Municipio>();

		return municipios;
	}

	public boolean validateData() {
		if (invalid(user.getUsuario())) {
			facesMessages.addToControlFromResourceBundle("regUserName",
					"mandatory");

			return false;
		}
		if (invalid(user.getApellido1())) {
			facesMessages.addToControlFromResourceBundle("regfirstSurname",
					"mandatory");
			return false;

		}
		if (invalid(user.getApellido2())) {
			facesMessages.addToControlFromResourceBundle("regsecondSurname",
					"mandatory");
			return false;
		}

		if (invalid(user.getTelefono())) {
			facesMessages.addToControlFromResourceBundle("regPhone",
					"mandatory");
			return false;
		}

		if (this.getMunicipioUsuario() == null) {
			facesMessages.addToControlFromResourceBundle("regMunicipio",
					"mandatory");
			return false;
		}

		if (this.getProvinciaUsuario() == null) {
			facesMessages.addToControlFromResourceBundle("regProvincias",
					"mandatory");
			return false;
		}

		return true;
	}

	boolean invalid(String field) {
		if (field == null)
			return true;
		else if (field.equals(""))
			return true;
		return false;
	}

	/***************************************************************************
	 * Getters & Setters
	 **************************************************************************/
	public Usuario getUser() {
		return user;
	}

	public void setUser(Usuario nuevoUsuario) {
		this.user = nuevoUsuario;
	}

	public Provincia getProvinciaUsuario() {
		return provinciaUsuario;
	}

	public void setProvinciaUsuario(Provincia provinciaUsuario) {
		this.provinciaUsuario = provinciaUsuario;
	}

	public Municipio getMunicipioUsuario() {
		return municipioUsuario;
	}

	public void setMunicipioUsuario(Municipio municipioUsuario) {
		this.municipioUsuario = municipioUsuario;
	}

}
